package 常用类库API;

public class StringBuffer原理及方法
{
	public static void main(String[] args){
		String a="a";
		String b="b";
		String c=a+b+1;//字符串想加创建了 a b a+b a+b+1 c五个对象
		
		String d="a"+"b"+1;//编译期确定的常量，只创建一个对象
		
		//StringBuffer有效避免了字符串想加带来的垃圾对象过多的问题
		/*
		 StringBuffer() 简称sb默认数组长度是16，
		   如果知道字符串长度，创建StringBuffer对象时指定长度，StringBuffer(32)
		   从而避免动态扩充数组大小带来的性能损耗
		 sb多线程安全，性能稍损
		*/
		StringBuffer sb=new StringBuffer();//默认长度16
		sb.append(a).append(b).append(1);//append(各种数据类型)添加方法
		
		StringBuffer sb2=new StringBuffer(32);//建议使用这种构造方法创建对象
		//StringBuffer的常用方法
		//append()如上
		sb.toString();//输出字符串
		sb.insert(1,"a");//插入
		sb.reverse();//字符串反转
		//substrig() 截取, insert() 插入, indexOf() 查找
		//delete() 删除, replace() 替换, 等用法同String类
		
		/*
		 jdk1.5后引入 StringBuilder用法同StringBuffer
		 区别是，StringBuild更适合单线程，效率会更高，但多线程不安全，但比较常用
		 StringBuffer适合多线程，安全，效率低，不常用
		 
		*/
		//常量和变量想加，在虚拟机内部就是使用StringBuilder进行拼接的
		String c2="cca"+"b";//虚拟机内部默认使用StringBulider，效率高
		//但是在循环中，字符串相加，虚拟机内部同样使用StringBuilder效率就会变低，重复创建对象
		//通常循环中手动创建StringBuilder对象更合适
		String s=null;
		for(int i=0;i<5;i++){
			s+=1;//这种就不如手动创建Stringbuilder对象效率高了
		}
		StringBuilder sb3=new StringBuilder();
		for(int i=0;i<5;i++){
			sb3.append(1);
		}
		System.out.println(s+"===="+sb3.toString());
	}
}
